#include "item_handler.h"

// ------------ 掩码生成宏 ------------
#define MASK(bits) ((1U << (bits)) - 1)

// ------------ 基础操作方法 ------------
void item_set_current(Item *obj, uint16_t val) {
    // 安全截断输入值至当前项位宽
    obj->fields.current = val & MASK(CURRENT_BITS);
}

void item_set_options(Item *obj, uint16_t val) {
    // 安全截断输入值至可选项位宽
    obj->fields.options = val & MASK(OPTION_BITS);
}

// ------------ 验证策略实现 ------------
// 策略1：可选项为允许的位掩码，当前项必须在掩码允许的位中
bool validate_by_bitmask(uint8_t current, uint8_t options) {
    return (current & options) == current;  // 确保当前项的位全部在options的1的位内
}
// 策略2：可选项为最大允许值（current <= options）
bool validate_by_max_value(uint8_t current, uint8_t options) {
    return current <= options;
}

// ------------ 安全设置方法 ------------
bool item_safe_set_current(Item *obj, uint16_t value, ValidateFunc check) {
    // 只有当验证通过时才会更新当前项
    if (check(value, obj->fields.options)) {
        item_set_current(obj, value);
        return true;
    }
    return false;
}
